#include<stdio.h>
#include<Algorithm/delaunay.h>
#include<Mesh_IO/Mesh_IO.h>
#include<Mesh/libcell_iterator.h>
#include<libcell_macros.h>
#include<Algorithm/marching_cubes.h>
#include<Algorithm/points_cloud_algorithm.h>




void test()
{

    GRIDCELL grid;
    grid.p[0][0]=0.0; grid.p[0][1]=0.0; grid.p[0][2]=0.0;
    grid.p[1][0]=1.0; grid.p[1][1]=0.0; grid.p[1][2]=0.0;   
    grid.p[2][0]=1.0; grid.p[2][1]=-1.0; grid.p[2][2]=0.0;   
    grid.p[3][0]=0.0; grid.p[3][1]=-1.0; grid.p[3][2]=0.0;   
    grid.p[4][0]=0.0; grid.p[4][1]=0.0; grid.p[4][2]=1.0;   
    grid.p[5][0]=1.0; grid.p[5][1]=0.0; grid.p[5][2]=1.0;   
    grid.p[6][0]=1.0; grid.p[6][1]=-1.0; grid.p[6][2]=1.0;   
    grid.p[7][0]=0.0; grid.p[7][1]=-1.0; grid.p[7][2]=1.0;
    grid.val[0]=1; grid.val[1]=1; grid.val[2]=1; grid.val[3]=-1; grid.val[4]=1; grid.val[5]=1; grid.val[6]=1; grid.val[7]=1;

    TRIANGLE * triangles=(TRIANGLE*)malloc(sizeof(TRIANGLE)*5);
        
    int len=polygonise(grid,0,triangles);
    printf("len:%d\n",len);
    for(int i=0;i<len;i++)
    {
        //printf("%d %d %d\n",triangles[i].p); 
    } 

}


//3/4-x^2
//x^2/2-3x/2+9/8
//

Node* points_cloud_compute_normal_and_get_boundary_points(Node* n,KD_Node*kdtree,int num)
{
    // Node* re=NULL;
    // MatrixXd A(3,3);
    // clock_t t = clock();
    // for(Node* nit=n;nit!=NULL;nit=(Node*)(nit->Next))
    // {
    //     Normal_Boundary_Info* nbi=(Normal_Boundary_Info*)malloc(sizeof(Normal_Boundary_Info));
    //     normal_boundary_info_init(nbi);
    //     template_v* v=(template_v*)(nit->value);
    //     v->prop=nbi;
    //     Node* n1=kd_tree_find_n_adjacent_verticesn(v,kdtree,num);
    //     double* axis=compute_pca_result_using_eigen(n1);    
    //     nbi->normal[0]=axis[6];nbi->normal[1]=axis[7];nbi->normal[2]=axis[8];
    //     memmove(A.data(),axis,sizeof(double)*9);
    // }
    return NULL;
}

int main()
{
    // Mesh mesh;
    // Mesh_init(&mesh);
    // _ReadOff_(&mesh,"rabbitCut.off",3);
    // delaunay_triangulation_from_mesh(&mesh);    
    
    // Mesh_free(&mesh);
    //test();

    double *A=(double*)malloc(sizeof(double)*6);
    // A[0]=1;A[1]=1;A[2]=0;A[3]=1;A[4]=1;A[5]=0;
    // double s[2]={0}, VT[4]={0}, U[9]={0};
    A[0]=4;A[1]=8;A[2]=3;A[3]=6;A[4]=1;A[5]=0;
    double s[2]={0}, VT[4]={0}, U[9]={0};
    clapack_svd(A,2,2,s,U,VT);
    printf("%lf %lf\n",s[0],s[1]);
    for(int i=0;i<2;i++)
    {
        printf("%lf %lf\n",VT[i*2+0],VT[i*2+1]);
    }
    // for(int i=0;i<3;i++)
    // {
    //     printf("%lf %lf %lf\n",U[i*3+0],U[i*3+1],U[i*3+2]);
    // } 
     
    printf("enddd\n");
     
    return 0;
}
